package com.example.rabbitmqspringboot.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @author zfj
 * @date 2022/4/26 -17:13
 */
@Component
@Slf4j
public class MyCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback {


	@Autowired
	private  RabbitTemplate rabbitTemplate;
	//项目启动的时候执行该方法
	@PostConstruct
	public void init(){
		//注入
		rabbitTemplate.setConfirmCallback(this);
		rabbitTemplate.setReturnsCallback(this);
	}
	/**
	 * 交换机确认回调方法
	 * 交换机发消息 接收到的回调
	 * @param correlationData 保存回调消息的id及相关消息
	 * @param ack 交换机收到消息 true
	 * @param cause null
	 * 发消息交换机接收失败了
	 *@param correlationData 保存回调消息的id及相关消息
	 *@param ack 交换机收到消息 false
	 *@param cause 失败原因
	 */
	@Override
	public void confirm(CorrelationData correlationData, boolean ack, String cause) {
		String id=correlationData!=null?correlationData.getId():"";
		if(ack){
			log.info("交换机已经收到 id 为:{}的消息",id);
		}else{
			log.info("交换机还未收到 id 为:{}消息,由于原因:{}",id,cause);
		}
	}

	//可以再当消息传递过程中不可达的时候将消息返回给生产者
	//只有不可达的时候才能进入该方法
	@Override
	public void returnedMessage(ReturnedMessage returnedMessage) {
		log.error("消 息 {}, 被交换机 {} 退回，退回原因 :{}, 路 由 key:{}",
				returnedMessage.getMessage(),returnedMessage.getExchange(),returnedMessage.getReplyText(),returnedMessage.getRoutingKey());
	}
}
